package com.ruoyi.file.utils;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;

/**
 * 文件路径工具类
 * 统一处理文件路径生成逻辑
 *
 * @author ruoyi
 */
public class FilePathUtils {

    /**
     * 生成带日期的文件路径
     *
     * @param fileName 原始文件名
     * @return 生成的文件路径 (格式: yyyy/MM/dd/filename_timestamp.ext)
     */
    public static String generateFilePathWithDate(String fileName) {
        String dateDir = DateUtils.dateTimeNow("yyyy/MM/dd");
        String timestamp = String.valueOf(System.currentTimeMillis());
        String extension = FileTypeUtils.getFileExtension(fileName);
        String nameWithoutExt = FileTypeUtils.getFileNameWithoutExtension(fileName);

        return String.format("%s/%s_%s%s", dateDir, nameWithoutExt, timestamp, extension);
    }

    /**
     * 生成指定目录的文件路径
     *
     * @param fileName   原始文件名
     * @param targetPath 目标路径
     * @return 生成的文件路径
     */
    public static String generateFilePathWithTarget(String fileName, String targetPath) {
        String normalizedPath = normalizeTargetPath(targetPath);
        String timestamp = String.valueOf(System.currentTimeMillis());
        String extension = FileTypeUtils.getFileExtension(fileName);
        String nameWithoutExt = FileTypeUtils.getFileNameWithoutExtension(fileName);

        // 组合路径：目标路径 + 文件名_时间戳 + 扩展名
        if (StringUtils.isBlank(normalizedPath)) {
            return String.format("%s_%s%s", nameWithoutExt, timestamp, extension);
        } else {
            // 直接使用用户提供的路径，只添加文件名和时间戳
            return String.format("%s/%s_%s%s", normalizedPath, nameWithoutExt, timestamp, extension);
        }
    }

    /**
     * 根据条件生成文件路径
     *
     * @param fileName   原始文件名
     * @param targetPath 目标路径（可为空）
     * @return 生成的文件路径
     */
    public static String generateFilePath(String fileName, String targetPath) {
        if (StringUtils.isNotBlank(targetPath)) {
            // 如果提供了目标路径，直接使用该路径，不添加日期路径
            String normalizedPath = normalizeTargetPath(targetPath);
            String timestamp = String.valueOf(System.currentTimeMillis());
            String extension = FileTypeUtils.getFileExtension(fileName);
            String nameWithoutExt = FileTypeUtils.getFileNameWithoutExtension(fileName);
            
            return String.format("%s/%s_%s%s", normalizedPath, nameWithoutExt, timestamp, extension);
        } else {
            // 如果没有提供目标路径，则使用日期路径
            return generateFilePathWithDate(fileName);
        }
    }

    /**
     * 规范化目标路径
     * 支持 /whh/test/、whh/test/、whh/test 等格式
     *
     * @param targetPath 目标路径
     * @return 规范化后的路径
     */
    public static String normalizeTargetPath(String targetPath) {
        if (StringUtils.isBlank(targetPath)) {
            return "";
        }

        // 移除前后的斜杠和空格
        String normalized = targetPath.trim();
        if (normalized.startsWith("/")) {
            normalized = normalized.substring(1);
        }
        if (normalized.endsWith("/")) {
            normalized = normalized.substring(0, normalized.length() - 1);
        }

        // 如果处理后为空，返回空字符串
        if (normalized.isEmpty()) {
            return "";
        }

        return normalized;
    }

    /**
     * 从完整路径中提取文件名
     *
     * @param filePath 完整文件路径
     * @return 文件名
     */
    public static String extractFileName(String filePath) {
        if (StringUtils.isBlank(filePath)) {
            return "";
        }

        int lastSlashIndex = filePath.lastIndexOf('/');
        if (lastSlashIndex >= 0) {
            return filePath.substring(lastSlashIndex + 1);
        }

        return filePath;
    }

    /**
     * 从完整路径中提取目录路径
     *
     * @param filePath 完整文件路径
     * @return 目录路径
     */
    public static String extractDirectoryPath(String filePath) {
        if (StringUtils.isBlank(filePath)) {
            return "";
        }

        int lastSlashIndex = filePath.lastIndexOf('/');
        if (lastSlashIndex > 0) {
            return filePath.substring(0, lastSlashIndex);
        }

        return "";
    }

    /**
     * 构建最终的文件名（带后缀）
     * 优先使用源文件的后缀，其次使用保存文件名的后缀，都没有则报错
     *
     * @param originalFileName 源文件名
     * @param saveFileName 保存文件名（可能带后缀）
     * @return 最终的文件名（带后缀）
     * @throws IllegalArgumentException 如果无法确定文件后缀
     */
    public static String buildFinalFileName(String originalFileName, String saveFileName) {
        // 从源文件名提取后缀
        String originalExt = FileTypeUtils.getFileExtension(originalFileName);
        
        // 如果源文件有后缀，优先使用源文件后缀
        if (StringUtils.isNotBlank(originalExt)) {
            // 去掉保存文件名中可能存在的后缀
            String saveFileNameWithoutExt = FileTypeUtils.getFileNameWithoutExtension(saveFileName);
            if (StringUtils.isBlank(saveFileNameWithoutExt)) {
                saveFileNameWithoutExt = saveFileName;
            }
            return saveFileNameWithoutExt + originalExt;
        }
        
        // 源文件没有后缀，尝试使用保存文件名的后缀
        String saveExt = FileTypeUtils.getFileExtension(saveFileName);
        if (StringUtils.isNotBlank(saveExt)) {
            return saveFileName;
        }
        
        // 都没有后缀，报错
        throw new IllegalArgumentException("无法确定文件后缀，请确保源文件名或保存文件名包含有效的文件扩展名");
    }

    /**
     * 生成最终的文件名（支持自定义保存文件名）
     * 
     * @param originalFileName 源文件名
     * @param saveFileName 保存文件名（可为空，为空则使用时间戳）
     * @return 最终的文件名（只包含文件名，不包含路径）
     */
    public static String generateFinalFileName(String originalFileName, String saveFileName) {
        // 如果没有提供保存文件名，使用时间戳
        if (StringUtils.isBlank(saveFileName)) {
            String timestamp = String.valueOf(System.currentTimeMillis());
            String extension = FileTypeUtils.getFileExtension(originalFileName);
            
            if (StringUtils.isBlank(extension)) {
                throw new IllegalArgumentException("源文件名缺少文件扩展名");
            }
            
            return timestamp + extension;
        } else {
            // 使用自定义保存文件名，构建最终文件名
            return buildFinalFileName(originalFileName, saveFileName);
        }
    }

    /**
     * 组合目录路径和文件名（不添加时间戳）
     * 用于在已经确定最终文件名的情况下，只需要添加目录路径
     * 
     * @param fileName 最终文件名（不添加时间戳）
     * @param targetPath 目标路径（可为空，为空则使用日期路径）
     * @return 完整的文件路径
     */
    public static String combinePathAndFileName(String fileName, String targetPath) {
        if (StringUtils.isNotBlank(targetPath)) {
            // 如果提供了目标路径，使用该路径
            String normalizedPath = normalizeTargetPath(targetPath);
            return String.format("%s/%s", normalizedPath, fileName);
        } else {
            // 如果没有提供目标路径，使用日期路径
            String dateDir = DateUtils.dateTimeNow("yyyy/MM/dd");
            return String.format("%s/%s", dateDir, fileName);
        }
    }
}
